home *** CD-ROM | disk | FTP | other *** search
/ Tech Arsenal 1 / Tech Arsenal (Arsenal Computer).ISO / tek-04 / bipl.zip / PROGS.ZIP / MIU.ICN < prev    next >
Text File  |  1992-09-28  |  2KB  |  77 lines

  1. ############################################################################
  2. #
  3. #    File:     miu.icn
  4. #
  5. #    Subject:  Program to generate strings from the MIU system
  6. #
  7. #    Author:   Cary A. Coutant, modified by Ralph E. Griswold
  8. #
  9. #    Date:     June 3, 1991
  10. #
  11. ###########################################################################
  12. #
  13. #     This program generates strings from the MIU string system.
  14. #
  15. #     The number of generations is determined by the command-line argument.
  16. #  The default is 7.
  17. #
  18. #  Reference:
  19. #
  20. #     Godel, Escher, and Bach: an Eternal Golden Braid, Douglas R.
  21. #  Hofstadter, Basic Books, 1979. pp. 33-36.
  22. #
  23. ############################################################################
  24.  
  25. procedure main(arg)
  26.    local count, gen, limit
  27.  
  28.    limit := integer(arg[1]) | 7
  29.    gen := set(["MI"])
  30.  
  31.    every count := 1 to limit do {
  32.       gen := nextgen(gen)
  33.       show(count,gen)
  34.       }
  35.  
  36. end
  37.  
  38. # show - show a generation of strings
  39.  
  40. procedure show(count,gen)
  41.  
  42.    write("Generation #",count,", ",*gen," strings")
  43.    every write("   ",image(!sort(gen)))
  44.    write()
  45.  
  46. end
  47.  
  48. # nextgen - given a generation of strings, compute the next generation
  49.  
  50. procedure nextgen(gen)
  51.    local new
  52.  
  53.    new := set()
  54.    every insert(new,apply(!gen))
  55.    return new
  56.  
  57. end
  58.  
  59. # apply - produce all strings derivable from s in a single rule application
  60.  
  61. procedure apply(s)
  62.  
  63. # Here's a case where referring to the subject by name inside scanning
  64. # is justified.
  65.  
  66.    s ? {
  67.      if ="M" then suspend s || tab(0)
  68.      tab(-1)            # to last character
  69.      if ="I" then suspend s || "U"
  70.      tab(1)            # back to the beginning
  71.      suspend tab(find("III")) || (move(3) & "U") || tab(0)
  72.      tab(1)            # back to the beginning
  73.      suspend tab(find("UU")) || (move(2) & tab(0))
  74.      }
  75.  
  76. end
  77.